import { takeEvery, put } from 'redux-saga/effects'
import {
	addProductToCart,
	addProductToLocalCart,
	changeLocalProductNumber,
	changeServiceProductNumber,
	deleteProductFromCart,
	deleteProductFromLocalCart,
	loadCarts,
	saveCarts,
} from '../actions/cart.actions'
import axios from 'axios'

// 将商品添加到购物车中
// 页面触发actions时携带的参数可以通过action获取
// payload 是中间件写好的参数
function* handleAddProductToCart(action) {
	const { data } = yield axios.post('http://localhost:3005/cart/add', {
		gid: action.payload,
	})
	// 触发action 添加到本地store中，将被reducer接收
	yield put(addProductToLocalCart(data))
}

//向服务器端发送请求 获取购物车列表数据
function* handleLoadCarts() {
	const { data } = yield axios.get('http://localhost:3005/cart')
	// 触发 action 添加到本地store中，将被reducer接收
	yield put(saveCarts(data))
}

//向服务器端发送请求 告诉服务器端我们要删除哪一个商品
function* handleDeleteProductFromCart(action) {
	const { data } = yield axios.delete('http://localhost:3005/cart/delete', {
		params: {
			cid: action.payload,
		},
	})
	// 被 reducer 接收
	yield put(deleteProductFromLocalCart(data.index))
}

// 向服务器端发送请求 告诉服务器端我们要更改商品数量
function* handleChangeServiceProductNumber(action) {
	const { data } = yield axios.put(
		'http://localhost:3005/cart',
		action.payload
	)
	yield put(changeLocalProductNumber(data))
}

// 要求导出一个函数
// 接收actions
export default function* cartSaga() {
	// 将商品添加到购物车中
	yield takeEvery(addProductToCart, handleAddProductToCart)
	// 向服务器端发送请求 获取购物车列表数据
	yield takeEvery(loadCarts, handleLoadCarts)
	// 向服务器端发送请求 告诉服务器端我们要删除哪一个商品
	yield takeEvery(deleteProductFromCart, handleDeleteProductFromCart)
	// 向服务器端发送请求 告诉服务器端我们要更改商品数量
	yield takeEvery(
		changeServiceProductNumber,
		handleChangeServiceProductNumber
	)
}
